#!/usr/bin/env python
""" check_supybot_plugin -- ensure that a plugin is loaded by supybot.

Run like:

    check_supybot_plugin --target fedmsg
    check_supybot_plugin --target koji --debug

"""

import argparse
import sys
import socket
import string
import uuid


def process_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-t', '--target', default=None, dest='target',
        help="Required.  The plugin we're looking for."
    )
    parser.add_argument(
        '-n', '--nick', default=None, dest='nick',
        help="NICK to use when connecting to freenode.",
    )
    parser.add_argument(
        '-d', '--debug', default=False, action='store_true',
        help='Print out debug information.', dest='debug',
    )
    parser.add_argument(
        '-H', '--host', default='irc.freenode.net',
        help='Host to connect to.', dest='host',
    )
    parser.add_argument(
        '-p', '--port', default=6667, type=int,
        help='Host to connect to.', dest='port',
    )
    return parser.parse_args()

args = process_args()

# Use a random nick so people can't mess with us
if not args.nick:
    args.nick = 'nrpe-' + str(uuid.uuid4()).split('-')[0]

name = "NRPE Bot"
readbuffer = ""

if not args.target:
    print "UNKNOWN:  No 'target' specified."
    sys.exit(3)

args.target = args.target.lower()

if args.debug:
    print "connecting to %s/%i" % (args.host, args.port)

try:
    s = socket.socket()
    s.connect((args.host, args.port))

    if args.debug:
        print "as %s/%s (%s)" % (args.nick, args.nick, name)

    s.send("nick %s\r\n" % args.nick)
    s.send("USER %s %s bla :%s\r\n" % (args.nick, args.host, name))

    while 1:
        readbuffer = readbuffer+s.recv(1024)
        temp = string.split(readbuffer, "\n")
        readbuffer = temp.pop()

        for line in temp:
            line = string.rstrip(line)

            if args.debug:
                print " * ", line

            line = string.split(line)

            if line[1] == 'MODE':
                msg = "privmsg zodbot :list\r\n"
                if args.debug:
                    print "sending:"
                    print " ->", msg
                s.send(msg)

            if line[1] == 'PRIVMSG':
                if args.debug:
                    print "Got our response.."

                plugins = map(str.lower, ' '.join(line[3:][1:]).split(', '))

                if args.target in plugins:
                    print "OK"
                    s.send("QUIT")
                    sys.exit(0)
                else:
                    print "CRITICAL: %r not loaded by supybot" % args.target
                    s.send("QUIT")
                    sys.exit(2)
except Exception as e:
    print "UNKNOWN: ", str(e)
    if args.debug:
        raise
    sys.exit(3)
